/******************************************************
 * @file fonts_manager.c
 * @author Destiny 
 * @brief 字体模块管理程序
 * 
 * @version 0.1
 * @date 2024-07-18
 *****************************************************/
#include <config.h>
#include <fonts_manager.h>
#include <string.h>



static PT_FontOpr g_ptFontOprHead = NULL;
static int g_dwFontSize;      /* 字体大小 */

/*
 * @description		    	: 向框架注册一个字体模块
 * @param - PT_FontOpr	 	: 需要注册的字体模块结构体指针
 * @return 			    	: 0 成功;其他 失败
 */
int RegisterFontOpr(PT_FontOpr ptFontOpr)
{
	PT_FontOpr ptTmp;

	if (!g_ptFontOprHead)
	{
		g_ptFontOprHead   = ptFontOpr;
		ptFontOpr->ptNext = NULL;
	}
	else
	{
		ptTmp = g_ptFontOprHead;
		while (ptTmp->ptNext)
		{
			ptTmp = ptTmp->ptNext;
		}
		ptTmp->ptNext     = ptFontOpr;
		ptFontOpr->ptNext = NULL;
	}

	return 0;
}

/*
 * @description		    : 打印所有字体模块名称
 * @param - 		 	: 无
 * @return 			    : 无
 */
void ShowFontOpr(void)
{
	int i = 0;
	PT_FontOpr ptTmp = g_ptFontOprHead;
	while (ptTmp)
	{
		printf("%02d %s\n", i++, ptTmp->name);
		ptTmp = ptTmp->ptNext;
	}
}

/*
 * @description		    : 依据名称得到对应字体模块结构体指针
 * @param - pcName   	: 字体模块名称
 * @return 			    : 成功 字体模块结构体指针;失败 NULL
 */
PT_FontOpr GetFontOpr(char *pcName)
{
	PT_FontOpr ptTmp = g_ptFontOprHead;
	
	while (ptTmp)
	{
		if (strcmp(ptTmp->name, pcName) == 0)
		{
			return ptTmp;
		}
		ptTmp = ptTmp->ptNext;
	}
	return NULL;
}

/*
 * @description		    : 设置所有字体大小
 * @param - dwFontSize  : 字体大小
 * @return 			    : 无
 */
void SetFontSize(uint32_t dwFontSize)
{
	PT_FontOpr ptTmp = g_ptFontOprHead;
	
	g_dwFontSize = dwFontSize;

	while (ptTmp)
	{
		if (ptTmp->SetFontSize)
		{
			ptTmp->SetFontSize(dwFontSize);
		}
		ptTmp = ptTmp->ptNext;
	}
}

/*
 * @description		    : 得到当前字体大小
 * @param - 			: 无
 * @return 			    : 字体大小
 */
uint32_t GetFontSize(void)
{
	return g_dwFontSize;
}

/*
 * @description		    : 根据编码得到字体位图
 * @param - dwCode		: 无
 * @param - ptFontBitMap: 字体位图描述结构体指针
 * @return 			    : 0 成功;其他 失败
 */
int GetFontBitmap(uint32_t dwCode, PT_FontBitMap ptFontBitMap)
{
	int iError = 0;
	PT_FontOpr ptTmp = g_ptFontOprHead;

	while (ptTmp)
	{
		iError = ptTmp->GetFontBitmap(dwCode, ptFontBitMap);
		if (0 == iError)
		{
			return 0;
		}
		ptTmp = ptTmp->ptNext;
	}
	return -1;
}

/*
 * @description		    : 设置指定字体的大小
 * @param - pcFontsName	: 字库名称
 * @param - pcFontsFile	: 字体文件
 * @param - dwFontSize	: 字体大小
 * @return 			    : 0 成功;其他 失败
 */
int SetFontsDetail(char *pcFontsName, char *pcFontsFile, uint32_t dwFontSize)
{
	int iError = 0;
	PT_FontOpr ptFontOpr;

	char cFontsFilePath[128];

	ptFontOpr = GetFontOpr(pcFontsName);
	if (NULL == ptFontOpr)
	{
		return -1;
	}

	g_dwFontSize = dwFontSize;
	sprintf(cFontsFilePath,"%s%s",FONT_FILE_PATH,pcFontsFile);

	iError = ptFontOpr->FontInit(cFontsFilePath, dwFontSize);
	
	return iError;
}

/*
 * @description		    : 字体模块初始化
 * @param - 			: 无
 * @return 			    : 0 成功;其他 失败
 */
int FontsInit(void)
{
	int iError;
	iError = ASCIIInit();
	if (iError)
	{
		DBG_PRINTF(DLOG_LVL_ERROR,DLOG_TAG,"ASCIIInit error!\n");
		return -1;
	}
	iError = FreeTypeInit();
	if (iError)
	{
		DBG_PRINTF(DLOG_LVL_ERROR,DLOG_TAG,"FreeTypeInit error!\n");
		return -1;
	}

	return 0;
}

